package io;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * @User: vitobo
 * @Date: 2024-08-13
 * @Description: 写文件
 *
 *  OutputStream在写文件的时候, 文件不存在, 就会自动创建;
 *
 *  对于OutputStream来说, 默认情况下, 打开一个文件, 会先清空文件原有的内容;
 *      如果不想清空, 流对象还提供了一个"追加写"对象,  通过这个就可以实现不清空文件, 把新内容追加写到后面;
 *
 *
 * close() 操作的含义是: 关闭文件,
 *  进程->在内核里, 使用PCB这样的数据结构来表示进程;
 *  PCB中有一个重要的属性, 文件描述符(记录了该进程打开了哪些文件);
 *      一个进程中有多个线程多个PCB, 这些PCB共用同一个文件描述符;
 *
 *  每次打开文件操作, 就会在文件描述符表中, 申请一个位置, 把这个信息放进去;
 *  每次关闭文件, 也就会把这个文件描述符对应的表项给释放掉;
 *
 *  如果没有close(), 对应的表项, 没有及时释放, 意味着文件描述符表可能很快就被占满了, (这个数组, 不能自动扩容, 存在上限的)
 *
 *
 *  close() 一般来说是要执行的, 但是如果一个程序, 这里的文件对象需要自始至终的使用, 不关闭也问题不大;
 *      随着进程结束, PCB销毁了, 文件描述符也就销毁了, 对应的资源操作系统就自动回收了;
 *
 *
 *
 */


public class IODemo7 {
    // 进行写文件
    public static void main(String[] args) throws IOException {

        // 虽然没有显式的写close(), 实际上是会执行的, 只要try语句块执行完毕, 就可以自动执行到close;
        // 这个语法, 在Java中被称为 try with resources
        try(OutputStream outputStream = new FileOutputStream("f:/test.txt")){
            outputStream.write(97);
            outputStream.write(98);
            outputStream.write(99);
            outputStream.write(100);
        }

    }

    public static void main1(String[] args) throws IOException {
        OutputStream outputStream = new FileOutputStream("f:/test.txt");

        outputStream.write(97);
        outputStream.write(98);
        outputStream.write(99);
        outputStream.write(100);

        outputStream.close();

    }
}
